package com.wl.lib.mvi

import android.os.Bundle
import android.view.LayoutInflater
import androidx.viewbinding.ViewBinding
import java.lang.reflect.ParameterizedType


// Created by wangliang on 2024/4/25.
abstract class BaseBindingActivity<VB : ViewBinding>() :
    BaseActivity() {

    // 子类使用的时候如果不能确定是否被释放，则需要使用此属性，避免出现空指针异常
    protected var _binding: VB? = null

    // 子类如果明确不会在 onDestroyView 后调用的话，可以使用此属性
    protected val binding: VB
        get() = requireNotNull(_binding) { "The property of binding has been destroyed." }

    override fun onCreate(savedInstanceState: Bundle?) {
        _binding = initBinding(layoutInflater)
        setContentView(binding.root)
        super.onCreate(savedInstanceState)
    }

    // 为了减少上层页面样板代码，采用反射形式来创建 binding，当然会损失一部分性能，先这样，如果有特殊需要可以覆盖此方法
    @Suppress("UNCHECKED_CAST")
    protected fun initBinding(inflater: LayoutInflater): VB? {
        val type = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as? Class<*> ?: return null
        val method = type.getMethod("inflate", LayoutInflater::class.java)
        return method.invoke(null, inflater) as? VB
    }

    override fun onDestroy() {
        super.onDestroy()
        _binding = null
    }
}